本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。
本文介绍了Alibaba Cloud Linux 3系统中使用GPU进行加速的容器启动后,容器内无法使用GPU的原因及解决方案。
问题现象
在Alibaba Cloud Linux 3系统中,当systemd版本低于systemd-239-68.0.2.al8.1
时,执行systemctl daemon-reload
命令后容器无法访问GPU。
在容器内执行
nvidia-smi
无法查看到GPU信息。devices.list
发生了变化,例如GPU 0对应的权限变为195:* m
。
具体现象如下图所示(左图表示容器可正常访问GPU,右图表示容器无法访问GPU)。
问题原因
在/dev/char/
目录下以设备序号命名的设备节点(例如/dev/char/195:255
)与真实的NVIDIA GPU设备节点(例如/dev/nvidiactl
)之间不存在软连接。但runc
(运行容器的引擎)自行实现了这两者之间的关系转换,在容器启动时,runc会为该容器和所关联的GPU设置正确的device cgroup(设备控制组)。但是,runc
提供给systemd
的位于/dev/char/
目录下,以设备序号命名的设备节点(例如/dev/char/195:255)的cgroup(Control Group)配置信息并不存在。
执行systemctl daemon-reload
命令会将当前所有由systemd
管理的状态进行序列化,然后通过读取磁盘上的配置文件和反序列化应用新的状态的过程中,systemd
会根据自己所记录的状态重新应用所有的cgroup配置。但是,在不存在软连接关系的情况下,由于systemd
需要设置的/dev/char/
目录下以设备序号命名的设备节点(例如/dev/char/195:255
)并不存在,导致systemd
无法设置该cgroup,从而引发容器中无法使用GPU的问题。
解决方案
阿里云在systemd-239-78.0.4
版本中新增了一个默认打开的选项FullDelegationDeviceCGroup
,在服务配置Delegate=yes
的情况下,默认不重新应用device cgroup(设备控制组)。您可以将systemd
升级到最新版本以解决该问题。
在ECS实例中升级
systemd
至最新版本。sudo yum upgrade systemd
输入
y
确定升级。重启ECS实例,使配置生效。
警告重启实例将导致您的实例暂停运行,这可能引发业务中断和数据丢失。因此,建议您在执行此操作之前备份关键数据,并选择在非业务高峰期进行。
sudo reboot
确认
systemd
版本为systemd-239-78.0.4
或以上版本。rpm -qa systemd
在容器内执行
nvidia-smi
查看GPU信息。nvidia-smi
结果如下图所示,表明可以正常访问GPU。